DataformをGCEインスタンス上のGitリポジトリとSSHで連携してみる

DataformをGCEインスタンス上のGitリポジトリとSSHで連携してみる

Clock Icon2024.10.17

概要

Dataformは以下のサードパーティのリポジトリと接続することができます。

Gitプロバイダ 接続方法
Azure DevOps Services SSH
Bitbucket SSH
GitHub SSH or HTTPS
GitLab SSH or HTTPS

SaaS版のGitHubやGitLabに接続することが多いと思いますが、GCEにインストールしたサードパーティのGit(今回はGitLab)とも接続できるのかな?と思い気になったので試してみようと思ったのが今回の記事のきっかけです。

試してみたいことのイメージは以下です。
スクリーンショット 2024-10-17 22.42.16

それでは実際にGCEインスタンス上に構築したGitリポジトリ(GitLab)とDataformをSSH接続できるかどうかを検証してみたいと思います。ちなみに、GitLabとはSSHまたはHTTPSにて接続が可能となっていますが今回の記事ではまずSSHでの接続を試しています。HTTPSでの接続も追って記事にします。

やってみる

Compute Engineの準備

今回はGitLabを用いるのでインストール要件を以下の公式リファレンスより確認します。
https://gitlab-docs.creationline.com/ee/install/requirements.html

GitLabのインストール要件では4コア・4GBが最小限のコア・メモリ数とあったのでそれを踏まえて以下のスペックのGCEインスタンスを構築します。データベースは外出しせずにバンドルされているPostgreSQLをそのまま使ってもらいます。

設定項目 設定値
マシンタイプ e2-standard-4(4 vCPU 2コア 16GBメモリ)
ブートディスク 10GB
ファイアウォール HTTP・HTTPSトラフィックを許可する
イメージ Debian GNU/Linux 12 (bookworm)

イメージはDebianにしてますが特に理由はなく個人的な好みです(4コアが最小限ってわかっているのに2コアのマシンタイプを選んでます笑)。また今回は一時的な検証用なのでdefaultVPCネットワークに作成しています。

インスタンスが作成できたらGCEのコンソールからSSHで接続します。

GitLabのインストール

インストール方法はGitLabのリファレンスのDebianの項目を参考にします。
https://about.gitlab.com/ja-jp/install/#debian

インスタンスにSSH接続したらまずは必要な依存関係をインストールします。

sudo apt-get update
sudo apt-get install -y curl openssh-server ca-certificates perl

Postfixも必要なためインストールします(Postfixをインストールしない場合は外部SMTPサーバ設定をします)。

sudo apt-get install -y postfix

次にGitLabパッケージのリポジトリを設定します。

curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.deb.sh | sudo bash

パッケージをインストールします。EXTERNAL_URLには外部IP、または構築したGCEの外部IPをAレコードに設定したホスト名(ドメイン)を設定します。

sudo EXTERNAL_URL="https://有効なホスト名 または 外部IP" apt-get install gitlab-ee

有効なホスト名をEXTERNAL_URLに設定した場合、GitLabは自動的にLet's Encryptを使用して証明書をリクエストしてくれます。最高です。
スクリーンショット 2024-10-17 18.47.24

私は自分で管理しているドメインを用いて設定しましたので上記の通りLet's Encryptの証明書が適切に設定されていました。

外部IPをEXTERNAL_URLに設定した場合でもエラーメッセージが出ますが特に問題なくアクセスできます。

インストール完了したらrootユーザのパスワードを確認します。

sudo cat /etc/gitlab/initial_root_password

EXTERNAL_URLに指定したURLをブラウザに打ち込みアクセスします。GitLabのログイン画面が表示されたらインストール成功です。ユーザ名rootとパスワードを打ち込みログインしてください。
スクリーンショット 2024-10-17 22.36.28

※rootユーザのパスワード変更やrootユーザ以外の普段使いのユーザ作成などの設定を本来するべきなのですが今回はDataformとの接続検証のためだけなので特に設定しません。
本番環境などの用途で構築する場合はリファレンスを参照の上セキュリティ設定を必ず実施してください。

DataformからSSHで接続するための準備

DataformからSSHでリポジトリを連携する準備をします。該当のリファレンスがあるので読み込みます。
https://cloud.google.com/dataform/docs/connect-repository?hl=ja#connect-ssh

SSH 経由でリモート リポジトリを接続するには、SSH 認証鍵と Secret Manager のシークレットを生成する必要があります。SSH 認証鍵は公開 SSH 認証鍵と秘密 SSH 認証鍵で構成されます。公開 SSH 認証鍵を Git プロバイダと共有し、秘密 SSH 認証鍵を使用して Secret Manager シークレットを作成する必要があります。次に、デフォルトの Dataform サービス アカウントとシークレットを共有します。

・・・GCEでSSH認証鍵を作成してSecretManagerに登録してね、という理解をしました。

ざっくりとした流れとしては以下となります。

  1. GitLabでSSH認証鍵を作成
  2. GitLabリポジトリに公開鍵をアップロード
  3. Secret Managerに秘密鍵を登録
  4. Dataformのサービスアカウントにroles/secretmanager.secretAcessorロールを付与
  5. Dataform側で作業

それではまずGitLab側でSSH認証鍵を生成します。
https://docs.gitlab.com/ee/user/ssh.html#generate-an-ssh-key-pair

以下のコマンドでED25519 SSH鍵を生成します。

ssh-keygen -t ed25519

保存先やパスフレーズを聞かれますが何も入力せずにEnterを推します(入力いただいてもかまわないです)
デフォルトではホームディレクトリ配下に.sshディレクトリが作成され、そこに以下のように公開鍵(.pub)と秘密鍵が生成されています。

id_ed25519  id_ed25519.pub

公開鍵(id_ed25519.pub)をcatコマンドなどで開くなどしてコピーします。

鍵をコピーできたら、GitLabのEdit profileの画面へ移動します。
スクリーンショット 2024-10-17 20.28.45

SSH Keys > Add new keyを押下して公開鍵登録画面へ遷移し、先ほどコピーした鍵を貼り付けます。

スクリーンショット 2024-10-17 20.30.38

貼り付け後はAdd keyを押下して登録します。

Google Cloud側の作業

次にGoogle Cloud のSecret Managerのコンソールを開きます。
シークレットを作成を押下します。
スクリーンショット 2024-10-17 20.35.09

GCEで作成した秘密鍵(id_ed25519ファイル)の内容をコピーしておき、シークレットの値のところへ貼り付けます。名前は適当な名前を設定します。他の項目は全てデフォルトのまま作成します。
スクリーンショット 2024-10-17 20.38.43

続いてDataformのサービスアカウントにroles/secretmanager.secretAcessorロールを付与しておきます(手順は割愛します)。

また、適当な名前でGitLabのリポジトリを作成しておきます。
スクリーンショット 2024-10-17 20.44.16

作成したリポジトリのSSHのリンクをコピーします。
スクリーンショット 2024-10-17 20.47.09

Dataformのリポジトリを適当な名前で作成して、SETTINGSを開きます。
GITと接続を押下します。
スクリーンショット 2024-10-17 20.41.17

プロトコルはSSHを選択、リモートのGitリポジトリのURLには先ほど作成したリポジトリのSSHのURLを貼り付けます。
シークレットにはSecret Managerで作成したものを、ホストのSSH公開鍵のKey-Valueにはid_ed25519.pubの内容を貼り付けます※(コメントの部分root@〜は不要)。
スクリーンショット 2024-10-17 20.50.40

※SSH公開鍵のKey-Value
ssh-keyscanで作成するでよいと思います。作成結果に含まれるホスト名は不要です。

ssh-keyscan -t ed25519 <gitlab-host>

リポジトリと繋がっているか確認する

確認のためDataformの開発ワークスペースを適当な名前で作成します。
スクリーンショット 2024-10-17 22.21.50

GitLabのリポジトリで作成されたREADMEがワークスペース内で確認できました。無事GitLabと接続できているようです。
スクリーンショット 2024-10-17 20.58.31

せっかくなので適当なファイルを作成してCOMMITしてPUSHしてみます。
スクリーンショット 2024-10-17 21.00.20

GitLab側を確認してみます。
スクリーンショット 2024-10-17 21.03.51

PUSHした内容が連携されていました。Dataformと接続できていることが確かに確認できました。

補足

今回のVPC/GCEインスタンスはSSH接続を全てのIPから許可していますがこれはあくまで検証用に一時的に使っているだけで、本番運用には避けなくてはならないものです。
セキュアに運用するためには、DataformのEgress IPのみを許可する形などの運用が良いと考えられます(Egress IPはリファレンスに記載されいてるフォームから登録すると知ることができるようです。検証しておらず恐縮丸です)。

Note: Connecting a Dataform repository to a remote repository can fail if the remote repository is not open to the public internet, for example, if it is behind a firewall. You can fill out the Dataform egress IPs fixed ranges waitlist form to sign up for updates about consistent egress IP addresses in Dataform, which enable connections to protected remote repositories.

引用:https://cloud.google.com/dataform/docs/connect-repository#gitlab

また、検証が終わりましたらGCEのインスタンスの削除を忘れないようにしてください。

所感

わかったこと。

  • DataformはGCEインスタンス上のGitLabにSSH接続できる

リファレンスに従えば、とくに詰まるところはなくインストールや鍵の生成、登録、Dataformとの接続ができました。
今回の目標であるDataform <-> GCE上のGitの接続も確認できてよかったです。今回はGCEインスタンスのGitと連携していますが、オンプレミスや他のクラウドでもDataform接続元IPを注意すれば接続は問題なくできるのかなと思います。

次はHTTPSでの接続も試してみたいと思っています。
それでは、また。ナマステー

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.